package com.ht.modules.component.ai.assistants;

import com.ht.modules.component.ai.tools.service.ToolService;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.memory.chat.ChatMemoryProvider;
import dev.langchain4j.model.chat.StreamingChatModel;
import dev.langchain4j.rag.content.retriever.ContentRetriever;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.service.tool.ToolProvider;
import dev.langchain4j.store.embedding.EmbeddingStore;

/**
 * 助手服务
 */
public interface IAssistantService<T> {

    /**
     * 构建助手
     *
     * @param streamingChatModel 流式聊天模型
     * @param chatMemoryProvider 聊天记忆
     * @param contentRetriever   内容检索器
     * @param toolService        工具服务
     * @param toolProvider       工具提供器
     * @param clazz              助手类
     * @return T 助手
     */
    T buildAssistant(StreamingChatModel streamingChatModel,
                     ChatMemoryProvider chatMemoryProvider,
                     ContentRetriever contentRetriever,
                     ToolService toolService,
                     ToolProvider toolProvider,
                     Class<T> clazz
    );

    /**
     * 构建工具提供器
     *
     * @param resourceLocation 资源位置
     * @return ToolProvider 工具提供器
     */
    ToolProvider buildToolProvider(String resourceLocation);

    /**
     * 构建向量数据库
     *
     * @param tableName 表名
     * @return EmbeddingStore<TextSegment> 向量数据库
     */
    EmbeddingStore<TextSegment> buildEmbeddingStore(String tableName);

    /**
     * 构建向量数据库内容检索器
     *
     * @param tableName         内容检索表名
     * @param maxResults        最大结果数
     * @param minScore          最小分数
     * @param dynamicMinScore   动态最小分数
     * @param dynamicMaxResults 动态最大结果数
     * @return EmbeddingStoreContentRetriever 向量数据库内容检索器
     */
    EmbeddingStoreContentRetriever buildEmbeddingStoreContentRetriever(String tableName,
                                                                       int maxResults,
                                                                       double minScore,
                                                                       double dynamicMinScore,
                                                                       int dynamicMaxResults);

    /**
     * 构建聊天记忆
     *
     * @param maxMessages 最大消息数
     * @return ChatMemoryProvider 聊天记忆
     */
    ChatMemoryProvider buildChatMemoryProvider(int maxMessages);
}
